import tensorflow as tf

# tf.gather 可以实现根据索引号收集数据
x= tf.random.uniform([2,3,3],maxval=100,dtype=tf.int32)
print(x)
print('------------')
# 表示获取 x中1 轴索引为0,2 的数据
print(tf.gather(x,[0,2],axis=1))
print('------------')

#通过 tf.gather_nd 函数，可以通过指定每次采样点的多维坐标来实现多个点(通过给定索引号的方式采样)
x= tf.random.uniform([4,5,6],maxval = 100,dtype=tf.int32)
print('x:\n',x)
print('------------')
xx = tf.gather_nd(x,[[1,1,2],[2,2,3],[3,3,4]])
print(xx)

#通过给定掩码（Mask）的方式进行采样。
x = tf.random.uniform([4,5,6],maxval = 100,dtype=tf.int32)
print('x:\n',x)
print('------------')
xx = tf.boolean_mask(x,mask=[True,False,False,True],axis=0)
print(xx)

#通过 tf.where(cond,a,b)操作可以根据cond条件的真假从参数a或b中读取数据，当参数  a=b=None 时，即a和b参数不指定，tf.where 会返回cond张量中所有True的元素的索引坐标
x = tf.random.normal([3,3])
print(x)
print('------------')
mask=x>0
x=tf.where(mask)
print('x中大于0的索引：\n',x)

#tf.scatter_nd(indices,updates,shape)函数可以高效的刷新张量的部分数据，但是这个函数只能在全0的白板张量上执行双向操作
indices = tf.constant([[1],[3]])
print('indices:\n',indices)
print('------------')
updates = tf.constant([
    [[5,5,5,5],[6,6,6,6],[7,7,7,7],[8,8,8,8]],
    [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
])
print('indices:\n',updates)
print('------------')
x = tf.scatter_nd(indices,updates,[4,4,4])
print('x:\n',x)
print('------------')

